package com.saver.modules.oss;

import com.saver.common.utils.R;
import com.saver.common.utils.UuidUtil;
import com.saver.modules.sys.controller.AbstractController;
import com.saver.modules.sys.dao.SysAppendixDao;
import com.saver.modules.sys.entity.SysAppendixEntity;
import com.saver.modules.sys.service.SysAppendixService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Optional;

@RestController
@RequestMapping("/oss/file")
public class FileController extends AbstractController {

    @Autowired
    private FileDao fileDao;

    @Autowired
    private SysAppendixDao sysAppendixDao;

    @Autowired
    private SysAppendixService sysAppendixService;

    @GetMapping("/list")
    public R list(@RequestParam("path") String path) {
        List<FileEntity> list;
        if (path == null||"/".equals(path)) {
            list = fileDao.findByCreateUserIdAndPath(getUserId(), "/");
        } else {
            list = fileDao.findByCreateUserIdAndPath(getUserId(), path);
        }
        return R.ok().put("list", list);
    }

    @PostMapping("/add")
    public R add(@RequestBody FileEntity fileEntity) {
        if (fileEntity.getDirection()) {
            fileEntity.setId(null);
            fileEntity.setCreateUserId(getUserId());
            fileEntity.setDate(new Date());
            fileDao.save(fileEntity);
        } else {
            List<SysAppendixEntity> list = fileEntity.getList();
            for (SysAppendixEntity sysAppendixEntity : list) {
                FileEntity entity = new FileEntity();
                entity.setPath(fileEntity.getPath());
                entity.setDirection(fileEntity.getDirection());
                entity.setDate(new Date());
                entity.setName(sysAppendixEntity.getName());
                String uuid = UuidUtil.getUuid();
                entity.setUuid(uuid);
                entity.setCreateUserId(getUserId());
                Optional<SysAppendixEntity> byId = sysAppendixDao.findById(sysAppendixEntity.getId());
                if (byId.isPresent()){
                    File file = sysAppendixService.getFile(byId.get());
                    long length = file.length();
                    entity.setSize(length);
                    fileDao.save(entity);
                }

                sysAppendixService.update(sysAppendixEntity.getId(), uuid);
            }
        }
        return R.ok();
    }

    @PostMapping("/rename")
    public R rename(@RequestBody Map<String, Object> map) {
        Object id = map.get("id");
        Object newName = map.get("newName");
        FileEntity fileEntity = fileDao.findByIdAndCreateUserId((Integer) id, getUserId());
        fileEntity.setName((String) newName);
        if (!fileEntity.getDirection()) {
            List<SysAppendixEntity> byFileUuid = sysAppendixDao.findByFileUuid(fileEntity.getUuid());
            for (SysAppendixEntity sysAppendixEntity : byFileUuid) {
                sysAppendixEntity.setName((String) newName);
                sysAppendixDao.save(sysAppendixEntity);
            }
        }
        fileDao.save(fileEntity);
        return R.ok();
    }

    @PostMapping("/delete")
    public R delete(@RequestBody Integer[] id) {
        for (Integer integer : id) {
            fileDao.deleteById(integer);
        }
        return R.ok();
    }

}
